package com.fox.lock;

public interface DistributedLockService {
    /**
     * 尝试获取锁
     * @param lockKey 锁的key
     * @param requestId 请求的id
     * @param millis  redis里锁的超时时间
     * @return 失败返回flase 成功返回true
     */
    boolean tryAquire(String lockKey, String requestId, long millis);

    /**
     * 尝试多次获取锁
     * @param lockKey 锁的key
     * @param requestId 请求的id
     * @param millis   redis里锁的超时时间
     * @param tryTimes 尝试次数
     * @return 失败返回flase 成功返回true
     * @throws InterruptedException
     */
    boolean tryLock(String lockKey, String requestId, long millis, int tryTimes) throws InterruptedException;

    /**
     * 一直阻塞直到获取到锁
     * @param lockKey 锁的key
     * @param requestId 请求的id
     * @param millis redis里锁的超时时间
     * @param sleepMillis 获取失败等待时间
     * @return  返回true
     * @throws InterruptedException
     */
    boolean lock(String lockKey, String requestId, long millis, long sleepMillis) throws InterruptedException;

    /**
     * 释放锁
     * @param lockKey 锁的key
     * @param requestId 请求的id
     * @return 1表示释放了1个锁 0表示锁已经超时或被删除不需要释放 -1表示锁不是该线程的
     */
    int tryRelease(String lockKey, String requestId);

    /**
     * 添加锁的超时时间
     * @param lockKey 锁的key
     * @param requestId 请求id
     * @param millis 添加redis的超时时间
     * @return 大于0表示重置成功 -1表示锁永远存在 -2表示锁不存在 -3表示锁不是该线程的
     */
    long addExpire(String lockKey, String requestId, long millis);

}
